在Perl中,我可以使用next;
命令跳过foreach(或任何循环)迭代.
有没有办法跳过迭代并跳转到C#中的下一个循环?
foreach (int number in numbers) { if (number < 0) { // What goes here to skip over the loop? } // otherwise process number }
John Feminel.. 630
你要:
foreach (int number in numbers) // <--- go back to here --------+ { // | if (number < 0) // | { // | continue; // Skip the remainder of this iteration. -----+ } // do work }
以下是continue
关键字的更多信息.
更新:回应Brian在评论中的后续问题:
你能否进一步澄清如果我嵌套for循环我会做什么,并想跳过其中一个扩展的迭代?
for (int[] numbers in numberarrays) { for (int number in numbers) { // What to do if I want to // jump the (numbers/numberarrays)? } }
A continue
始终适用于最近的封闭范围,因此您无法使用它来突破最外层循环.如果出现这样的情况,你需要做一些更复杂的事情,具体取决于你想要的东西,比如break
内循环,然后continue
是外循环.有关break
关键字的文档,请参见此处.在break
C#的关键字是类似于Perl的last
关键字.
另外,考虑将Dustin的建议过滤掉您不想事先处理的值:
foreach (var basket in baskets.Where(b => b.IsOpen())) { foreach (var fruit in basket.Where(f => f.IsTasty())) { cuteAnimal.Eat(fruit); // Om nom nom. You don't need to break/continue // since all the fruits that reach this point are // in available baskets and tasty. } }
Dustin Campb.. 53
另一种方法是在循环执行之前使用LINQ进行过滤:
foreach ( int number in numbers.Where(n => n >= 0) ) { // process number }
这只是更整洁还是实际上更快,因为没有更少的预告?我猜测LINQ已经大大优化了但是LINQ部分必须在某个时刻预测,所以理论上如果数据集很大并且得到的'过滤'子集几乎一样大,那么这将会更慢,因为foreach必须发生两次?那么也许它取决于预期的结果子数据集? (3认同)
+1.虽然这不是对这个问题的直接回应,但在实践中我可能更喜欢这个解决方案而不是我提出的解决方案.使用LINQ似乎是一个很好的通用用例,用于过滤掉您不想处理的循环值. (2认同)
crashmstr.. 24
您还可以翻转if测试:
foreach ( int number in numbers ) { if ( number >= 0 ) { //process number } }
请不要使用更多ifs :( (4认同)
一个基于LINQ的答案很好,并且具有优雅,但使用if语句并没有错. (4认同)
Tamas Czineg.. 17
foreach ( int number in numbers ) { if ( number < 0 ) { continue; } //otherwise process number }
Edmund Covin.. 16
使用linq的另一种方法是:
foreach ( int number in numbers.Skip(1)) { // process number }
如果你想跳过许多项目中的第一项.
或者.SkipWhere
如果要指定跳过条件,请使用.
你要:
foreach (int number in numbers) // <--- go back to here --------+ { // | if (number < 0) // | { // | continue; // Skip the remainder of this iteration. -----+ } // do work }
以下是continue
关键字的更多信息.
更新:回应Brian在评论中的后续问题:
你能否进一步澄清如果我嵌套for循环我会做什么,并想跳过其中一个扩展的迭代?
for (int[] numbers in numberarrays) { for (int number in numbers) { // What to do if I want to // jump the (numbers/numberarrays)? } }
A continue
始终适用于最近的封闭范围,因此您无法使用它来突破最外层循环.如果出现这样的情况,你需要做一些更复杂的事情,具体取决于你想要的东西,比如break
内循环,然后continue
是外循环.有关break
关键字的文档,请参见此处.在break
C#的关键字是类似于Perl的last
关键字.
另外,考虑将Dustin的建议过滤掉您不想事先处理的值:
foreach (var basket in baskets.Where(b => b.IsOpen())) { foreach (var fruit in basket.Where(f => f.IsTasty())) { cuteAnimal.Eat(fruit); // Om nom nom. You don't need to break/continue // since all the fruits that reach this point are // in available baskets and tasty. } }
另一种方法是在循环执行之前使用LINQ进行过滤:
foreach ( int number in numbers.Where(n => n >= 0) ) { // process number }
您还可以翻转if测试:
foreach ( int number in numbers ) { if ( number >= 0 ) { //process number } }
foreach ( int number in numbers ) { if ( number < 0 ) { continue; } //otherwise process number }
使用linq的另一种方法是:
foreach ( int number in numbers.Skip(1)) { // process number }
如果你想跳过许多项目中的第一项.
或者.SkipWhere
如果要指定跳过条件,请使用.
您可以使用该continue
声明.
例如:
foreach(int number in numbers) { if(number < 0) { continue; } }
使用continue语句:
foreach(object number in mycollection) { if( number < 0 ) { continue; } }